寫完了「經典小遊戲 - 終極密碼」,現在就來寫寫看「經典小遊戲 - 1A2B」吧!!!
隨機產生4個不同的數字,利用線性搜尋法,逐一比對是否有重複的數字。
int[] ans = new int[4];
Random rand = new Random();
int count = 0;
private void btnStart_Click(object sender, EventArgs e)
{
int i = 0;
while (i < 4)
{
ans[i] = rand.Next(0, 10);
bool same = false; // 假設未重複
for (int j = 0; j < i; j++)
if (ans[j] == ans[i])
{
same = true;
break;
}
if (same) continue; //有重複的話,重新產生在 i 位置的數字
i = i + 1; // 沒有重複,處理下一個位置的數字
}
txtInput.Enabled = true; // 啟動該控制項
}
💡 線性搜尋法:在資料列中從頭開始逐一的搜尋,一筆一筆的資料值與搜尋目標值做比對,直到找到為止。
玩家輸入後,進行數字比對,判斷幾A幾B。
private void btnEnter_Click(object sender, EventArgs e)
{
string input = txtInput.Text;
count += 1; // 猜的次數加1
string message = "第" + count + "次 : " + input + "------";
int A = 0; int B = 0;
for (int i = 0; i < 4; i++)
{
//將字串中的數字字符,轉換為對應的整數值,並將該值存儲在變數 num 中
int num = input[i] - '0';
bool isFound = false;
int a; // 紀錄ans陣列中的位置
for (a = 0; a < 4; a++)
{
if (ans[a] == num)
{
isFound = true;
break;
}
}
if (isFound) // 判斷位置對錯
{
if (i == a) A++;
else B++;
}
}
message += A + "A" + B + "B";
if (A == 4)
{
txtOutput.Text += message + "\\r\\n" + "猜對了!!!";
txtInput.Enabled = false;
btnEnter.Enabled = false;
}
else txtOutput.Text += message + "\\r\\n";
txtInput.Text = "";
btnStart.Enabled = false;
}
用 for 迴圈,串接 Ans 陣列中的數字,然後用MessageBox顯示。
private void btnAns_Click(object sender, EventArgs e)
{
string output = "答案: ";
for (int i = 0; i < 4; i++) output += ans[i];
MessageBox.Show(output, "答案", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
啟動「開始」跟「確定」鈕,清除輸入的數字及提示資料,記錄的次數重設為0。
private void btnReset_Click(object sender, EventArgs e)
{
btnStart.Enabled = true;
btnEnter.Enabled = true;
txtOutput.Text = "";
txtInput.Text = "";
count = 0;
}
不想玩的時候,就可以點「結束」鈕,離開遊戲。
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
※以上資料如有錯誤請多指教
書名:程式設計基本功與實務範例解析:使用C#(第三版)(附範例光碟)
【Day30】[演算法]-線性搜尋法Linear Search